﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Library;

namespace Directory
{
  /// <summary>
  /// すべてのメンバー画面のフォームです。
  /// </summary>
  internal partial class AllMemberList : Form
  {
    #region パブリックコンストラクター
    /// <summary>
    /// 対象のグループを指定して AllMemberList クラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="group">対象のグループ。</param>
    public AllMemberList(DomainGroup group)
    {
      InitializeComponent();

      this.AddChildNode(group);  //子ノードを追加
      this.MemberTreeView.ExpandAll();
    }
    #endregion

    #region プライベートメソッド
    /// <summary>
    /// 子ノードを追加します。
    /// </summary>
    /// <param name="group">対象のグループ。</param>
    private void AddChildNode(DomainGroup group)
    {
      var imageIndex = (int)group.Category;
      var node = new TreeNode(group.Name, imageIndex, imageIndex);
      this.MemberTreeView.Nodes.Add(node);

      var members = DirectoryAccess.GetMembers(group);  //グループのメンバーを取得
      foreach (var member in members)
      {
        this.AddChildNode(node, member);   //子ノードを追加
        member.Dispose();
      }
    }

    /// <summary>
    /// 子ノードを追加します。
    /// </summary>
    /// <param name="node">子ノードを追加するノード。</param>
    /// <param name="member">子ノードになるメンバー。</param>
    private void AddChildNode(TreeNode node, DomainObject member)
    {
      var childNode = CreateNode(member);  //ノードを作成
      node.Nodes.Add(childNode);
      if (member.Category == CategoryType.Group)
      {
        var subMembers = DirectoryAccess.GetMembers((DomainGroup)member);   //グループのメンバーを取得
        foreach (var subMember in subMembers)
        {
          this.AddChildNode(childNode, subMember);  //子ノードを追加
          subMember.Dispose();
        }
      }
    }

    /// <summary>
    /// 指定したメンバーのノードを作成します。
    /// </summary>
    /// <param name="member">メンバー。</param>
    /// <returns>作成したノード。</returns>
    private TreeNode CreateNode(DomainObject member)
    {
      string displayName;   //表示するテキスト
      var fontColor = Color.Black;
      switch (member.Category)
      {
        case CategoryType.User:
          var user = (DomainUser)member;
          displayName = String.Format("{0}（{1}{2}：{3}/{4}）",
            user, user.LastName, user.FirstName, user.DisplayPath, user.Name);
          fontColor = Color.Brown;
          break;
        case CategoryType.Group:
          var group = (DomainGroup)member;
          displayName = String.Format("{0}（{1}：{2}）", group, group.Scope, group.DisplayPath);
          fontColor = Color.Blue;
          break;
        case CategoryType.Computer:
          var pc = (Computer)member;
          string sp = null;
          if (pc.OperatingSystemServicePack != null)
          {
            sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");
          }
          displayName = String.Format("{0}（{1}{2}：{3}）", pc, pc.OperatingSystem, sp, pc.Role);
          fontColor = Color.Green;
          break;
        default:  //CategoryType.ForeignSecurityPrincipal
          displayName = String.Format("{0}（{1}）", member, member.Name);
          break;
      }

      var imageIndex = (int)member.Category;
      return new TreeNode(displayName, imageIndex, imageIndex) { Name = member.Name, ForeColor = fontColor };
    }
    #endregion
  }
}
